Skip to content

feat(chalice): Add span streaming support to Chalice integration#6503

Open
ericapisani wants to merge 3 commits into
masterfrom
py-2312-migrate-chalice
Open

feat(chalice): Add span streaming support to Chalice integration#6503
ericapisani wants to merge 3 commits into
masterfrom
py-2312-migrate-chalice

Conversation

@ericapisani
Copy link
Copy Markdown
Member

@ericapisani ericapisani commented Jun 4, 2026

Add span streaming support behind the trace_lifecycle=stream experiment flag.
When enabled, start a segment span with Lambda/FaaS attributes for both
HTTP view functions and event source handlers instead of setting a
transaction name on the scope.

Also adds aws_lambda to CLOUD_PLATFORM constants.

Contains some duplication with #6498 since it's an AWS lambda framework.

Fixes PY-2312
Fixes #6010

Add span streaming support behind the trace_lifecycle=stream experiment flag.
When enabled, start a segment span with Lambda/FaaS attributes for both
HTTP view functions and event source handlers instead of setting a
transaction name on the scope.

Also adds aws_lambda to CLOUD_PLATFORM constants.

Fixes PY-2312
Fixes #6010
@linear-code
Copy link
Copy Markdown

linear-code Bot commented Jun 4, 2026

PY-2312

@ericapisani
Copy link
Copy Markdown
Member Author

bugbot run
@sentry review

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 208cf35. Configure here.

Comment thread sentry_sdk/integrations/chalice.py Outdated
Comment thread sentry_sdk/integrations/chalice.py Outdated
Comment on lines +204 to +206
invoked_arn = aws_context.invoked_function_arn
split_invoked_arn = invoked_arn.split(":")
aws_region = split_invoked_arn[3] if len(split_invoked_arn) > 3 else "unknown"
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although AWS sets this value and it's unlikely to be malformed, these extra guards were added to ensure that if it were, we don't crash the user's application

Comment thread sentry_sdk/integrations/chalice.py
Comment thread tests/integrations/chalice/test_chalice.py
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 4, 2026

Codecov Results 📊

88454 passed | ⏭️ 6022 skipped | Total: 94476 | Pass Rate: 93.63% | Execution Time: 293m 26s

📊 Comparison with Base Branch

Metric Change
Total Tests 📈 +28
Passed Tests 📈 +28
Failed Tests
Skipped Tests

All tests are passing successfully.

✅ Patch coverage is 98.48%. Project has 2481 uncovered lines.
❌ Project coverage is 89.37%. Comparing base (base) to head (head).

Files with missing lines (1)
File Patch % Lines
sentry_sdk/integrations/chalice.py 98.46% ⚠️ 1 Missing and 2 partials
Coverage diff
@@            Coverage Diff             @@
##          main       #PR       +/-##
==========================================
- Coverage    89.38%    89.37%    -0.01%
==========================================
  Files          192       192         —
  Lines        23285     23333       +48
  Branches      8002      8012       +10
==========================================
+ Hits         20811     20852       +41
- Misses        2474      2481        +7
- Partials      1309      1310        +1

Generated by Codecov Action

@ericapisani ericapisani marked this pull request as ready for review June 4, 2026 18:18
@ericapisani ericapisani requested a review from a team as a code owner June 4, 2026 18:18
Comment thread sentry_sdk/integrations/chalice.py
Comment on lines -43 to -54
try:
return ChaliceEventSourceHandler.__call__(self, event, context)
except Exception:
exc_info = sys.exc_info()
event, hint = event_from_exception(
exc_info,
client_options=client.options,
mechanism={"type": "chalice", "handled": False},

if has_span_streaming_enabled(client.options):
span = sentry_sdk.traces.start_span(
name=context.function_name,
parent_span=None,
attributes=_get_lambda_span_attributes(context),
)
sentry_sdk.capture_event(event, hint=hint)
client.flush()
reraise(*exc_info)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we need to do anything here, just leave as is -- this code doesn't do any tracing so we don't need to change it

The set of spans we're creating should be the same as in the legacy path, we don't want any new spans when streaming

Comment on lines +122 to +130
span = sentry_sdk.traces.start_span(
name=aws_context.function_name,
parent_span=None,
attributes={
**_get_lambda_span_attributes(aws_context),
**header_attrs,
**additional_attrs,
},
)
Copy link
Copy Markdown
Contributor

@sentrivana sentrivana Jun 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is also a new span compared to the legacy path -- please remove

As I understand, this integration is built on top of the AWS Lambda integration similar to e.g. Flask and WSGI? In that case, the pattern is usually that the parent integration creates the transaction/segment encompassing the whole request-response cycle, and the child integration then augments it with info specific to the child integration (e.g. better transaction name and source). The child integration may also create its own spans (e.g. for middlewares, DB queries etc.), but it shouldn't double-instrument the same thing as the top level segment

All of this is to say -- if we don't explicitly create a span in the legacy path, we shouldn't do it in span streaming either

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this integration specifically, we seem to just want to augment whatever transaction is currently running with the same data as in the AWS Lambda integration.

The question for me is, does this integration even make sense standalone? Because if not, then we don't need to do any sort of post-enrichment here, as it'll already have happened in the AWS Lambda integration. Otherwise, we need to duplicate the enriching logic, but apply it to the current segment instead of creating a new span.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Migrate chalice to span first

2 participants